package com.kamistoat.meimeichat.meimeichatserverapplication.netty;

import com.kamistoat.meimeichat.meimeichatserverapplication.netty.utils.NettySocketChannelUtil;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * NettyServer的所有自定义handlerd的父抽象类。
 * 这样一来就没有办法确定T的类型了，只能用泛型先表示着。然后在其各个实现子类中判断。
 * 这里制作成抽象类是为了复用读就绪/异常捕获/连接建立等事件方法，子类只需要重写一个非事件的 channelRead 方法即可
 */
public abstract class NettyServerBizHandler<T> extends SimpleChannelInboundHandler<T> {
    protected Logger logger = LoggerFactory.getLogger(NettyServerBizHandler.class);

    /**
     * 读就绪事件方法
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, T msg) throws Exception {
        channelRead(ctx.channel(), msg);
    }

    /**
     * Warning:子类只需要重写该方法
     */
    public abstract void channelRead(Channel channel, T msg);

    /**
     * 通道处于Active状态。此时代表BossGroup对于一个新的连接事件，已为其添加所有的handler并分配到一个EventLoop上.
     * 添加进在线用户Map的操作是在LoginHandler和ReConnectHandler中进行的
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
    }

    /**
     * 通道处于InActive状态
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        super.channelInactive(ctx);
    }

    /**
     * 异常处理
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        logger.error("业务处理出现异常: " + cause.getMessage());
    }

}
